41. First Missing Positive
41. First Missing Positive
Similar Question
leading to the advanced question
Solution Tips
方案一: Arithmetic-progression
var firstMissingPositive = function(nums) {
// 要 O(n) 的就无法 sort 了
// 等差数列的原地标记法,不能应付含有负数的情况,但是其实负数本身也不影响结果吧?
// 把负数过滤掉就好了?
nums = nums.filter((val) => val > 0);
// 过滤后再执行原地标记即可
for (let i = 0; i < nums.length; i++) {
const num = nums[i];
const itemIndex = Math.abs(num) - 1;
if (nums[itemIndex] > 0) {
nums[itemIndex] = -nums[itemIndex];
}
}
for (let i = 0; i < nums.length; i++) {
const num = nums[i];
if (num > 0) {
// 该项依然是正数,说明对应的 index + 1 的 num 不存在
return i + 1;
}
}
// 循环内没有 return,说明第一个 missing 的 index 为数组长度 + 1
return nums.length + 1;
};
console.log(firstMissingPositive([1,2,0]))
console.log(firstMissingPositive([3,4,-1,1]))
console.log(firstMissingPositive([7,8,9,11,12]))
参考之前的题目,这里也可以用置换法,目前来看置换和负数标记适用的场景是一样的, 置换反而还难理解一点。